/*******************************************
  Jose Andres Lara Vecino

  Author       : $$Author: cainlara@gmail.com $$
  Last CheckIn : $$Date: 2012-10-29 19:27:19 +0000 (Mon, 29 Oct 2012) $$
  Revision     : $$Revision: 112 $$
*******************************************/


package control;

import frente.Usuario;
import frente.UsuarioGuardado;
import gui.PanelPrincipal;
import gui.VentanaPrincipal;
import gui.dialogo.DialogoMensaje;

import java.awt.EventQueue;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.UIManager;

import mensaje.Mensaje;

import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel;

import seguridad.Seguridad;
import utilidad.Util;
import core.ManejadorLog;

/**
 * Clase principal.
 * <P>
 * Controla el flujo principal de la aplicacion.
 * 
 * @author jose.lara 06.06.2012
 */
public final class App {
    private static volatile VentanaPrincipal ventana    = null;
    private static volatile Sesion sesion               = null;
    
    private App() {
      //Imposible instanciar
    }
    
    public static VentanaPrincipal getVentana() {
        if(ventana == null) {
            ventana = new VentanaPrincipal();
            ventana.actualizarMenu();
            
            int opcion = PanelPrincipal.OPCION_DEFAULT;
            
            if(Util.getValorPropiedadSistema(IPropiedadesSistema.OPCION) == null) {
                opcion = PanelPrincipal.OPCION_PROYECTOS;
            } else {
                opcion = Integer.valueOf(Util.getValorPropiedadSistema(IPropiedadesSistema.OPCION));
                ventana.cargarOpcion(opcion);
            }
        }
        
        return ventana;
    }
    
    public static Sesion getSesion() {
        if(sesion == null) {
            sesion = Sesion.getInstance();
        }
        return sesion;
    }
    
    public static void main(String[] args) {
        
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                UsuarioGuardado usuario = null;
                
                try {
                    UIManager.setLookAndFeel(new SubstanceGraphiteLookAndFeel());
                    usuario = Util.obtenerUsuarioGuardado();
                    
                    if(usuarioValido(usuario)) {
                        Seguridad.iniciarSesion(usuario.getNombreUsuario(), usuario.getClave(), false, true);
                    }
                    
                    getVentana().setVisible(true);
                } catch (Exception e) {
                    ManejadorLog.escribirErrorEnLog(e);
                    
                    if(Util.cadenaValida(e.getMessage())) {
                        DialogoMensaje.mostrarMensajeError(null, e.getMessage());
                    }
                    else {
                        DialogoMensaje.mostrarMensajeError(null, Mensaje.getMensaje("ERROR_INESPERADO"));
                    }
                    
                    terminarEjecucion();
                }
            }
        });
    }
    
    private static boolean usuarioValido(UsuarioGuardado usuario) {
        return usuario != null && Util.cadenaValida(usuario.getNombreUsuario()) && Util.cadenaValida(usuario.getClave());
    }
    
    public static void terminarEjecucion() {
        if(getSesion().isIniciada()) {
            guardarOpcionCargada();
        }
        
        getVentana().setVisible(false);
        getVentana().dispose();
    }
    
    private static void guardarOpcionCargada() {
        int opcion          = PanelPrincipal.OPCION_DEFAULT;
        
        opcion = getVentana().getOpcionCargada();
        
        Util.actualizarValorPropiedadSistema(IPropiedadesSistema.OPCION, String.valueOf(opcion));
        
        try {
            Util.guardarPropiedadesSistema();
        }
        catch (FileNotFoundException e) {
            ManejadorLog.escribirErrorEnLog(e);
        }
    }
    
    public static void iniciarSesion(Usuario usuario, boolean guardarDatos) throws IOException {
        if(guardarDatos) {
            guardarDatosLogin(usuario);
        }
        
        getSesion().iniciar(usuario);
        getVentana().actualizarMenu();
        getVentana().cargarOpcion(PanelPrincipal.OPCION_PROYECTOS);
    }
    
    private static void guardarDatosLogin(Usuario usuario) throws IOException {
        File archivoConfiguracion   = null;
        PrintWriter impresor        = null;
        
        archivoConfiguracion = Util.obtenerArchivo(IPropiedadesSistema.ARCHIVO_CONFIG);
        
        if(archivoConfiguracion != null) {
            impresor = new PrintWriter(archivoConfiguracion);
            impresor.println(IPropiedadesSistema.USUARIO + ":" + usuario.getNombreUsuario());
            impresor.println(IPropiedadesSistema.MARCA + ":" + usuario.getClave());
            
            impresor.close();
        }
    }
    
//    private static class LookAndFeelStarter extends Thread {
//        @Override
//        public void run() {
//            try {
//                UIManager.setLookAndFeel(new SubstanceGraphiteLookAndFeel());
//                
//                getVentana().setVisible(true);
//            } catch (Exception e) {
//                ManejadorLog.escribirErrorEnLog(e);
//            }
//        }
//    }
}
